/*
 * reserves.cpp
 *
 *  Created on: 24/04/2012
 *      Author: alumne1asix
 */


#include "reserva.h"
#include "habitacio.h"
#include "hotel.h"
#include <list>
#include <string>
// Aquest include es per el "STRNCPY"
#include <string.h>

using namespace std;

bool habitacioLliureEntreDates(int numHabitacio, string dataInici, string dataFi);

/* variables globals del modul */
list<t_reserva> llistaReserves;

t_reserva getReserva(string aNomDe, string dataInici){
	t_reserva reserva;
	list<t_reserva>::iterator iteradorReserves;
	bool trobada;

	reserva.habitacioAsignada = -1;
	trobada = false;
	iteradorReserves = llistaReserves.begin();
	while(!trobada && iteradorReserves != llistaReserves.end()){
		trobada = (*iteradorReserves).aNomDe == aNomDe &&
				(*iteradorReserves).dataInici == dataInici;
		if(!trobada){
			iteradorReserves++;
		}
	}
	if(trobada){
		reserva = *iteradorReserves;
	}
	return reserva;
}
bool fesReserva(string aNomDe, string dataInici, string dataFi, int numPersones, bool volBany){
	t_reserva reserva;
	list<t_habitacio>::iterator iteradorHabitacions;
	list<t_habitacio> totesLesHabitacions;
	bool collocats;

	reserva.aNomDe = aNomDe;
	reserva.dataInici = dataInici;
	reserva.dataFi = dataFi;
	reserva.numPersones = numPersones;

	list<t_habitacio>::iterator iAux, iMin;
	t_habitacio eSwap;

	for(iteradorHabitacions = totesLesHabitacions.begin();
			iteradorHabitacions != totesLesHabitacions.end();
			iteradorHabitacions++){
		iMin = iteradorHabitacions; // Inicialitzo
		for(iAux = iteradorHabitacions; iAux != totesLesHabitacions.end(); iAux++){
			bool canvi;

			canvi = ( (*iAux).numPlaces < (*iMin).numPlaces ||
					( (*iAux).numPlaces == (*iMin).numPlaces &&
					(*iAux).teBany == false && (*iMin).teBany == true) );

			if(canvi){
				iMin = iAux;
			}
		}
		eSwap = *iteradorHabitacions;
		*iteradorHabitacions = *iMin;
		*iMin = eSwap;
	}

	totesLesHabitacions = demanarLlistaHabitacions();
	collocats = false;
	iteradorHabitacions = totesLesHabitacions.begin();
	while(!collocats && iteradorHabitacions != totesLesHabitacions.end()){
		bool teCapacitat, banyResolt, estaLliure;

		teCapacitat = (*iteradorHabitacions).numPlaces >= numPersones;
		banyResolt = ( !volBany || ( volBany && (*iteradorHabitacions).teBany ) );
		estaLliure = habitacioLliureEntreDates( (*iteradorHabitacions).numHabitacio, dataInici, dataFi );

		if(teCapacitat && banyResolt && estaLliure){
			collocats = true;
			//Creem la reserva
			reserva.habitacioAsignada = (*iteradorHabitacions).numHabitacio;
			llistaReserves.push_back(reserva);
		}
		iteradorHabitacions++;
	}
	return collocats;
}

bool habitacioLliureEntreDates(int numHabitacio, string dataInici, string dataFi){
	//Cal usar algoritmo se cumple para todos que no hay solapamiento
	bool hiHaCollisio = false;
	list<t_reserva>::iterator iteradorReserves= llistaReserves.begin();

	while(!hiHaCollisio && iteradorReserves != llistaReserves.end()){
		hiHaCollisio = numHabitacio == (*iteradorReserves).habitacioAsignada &&
						!((*iteradorReserves).dataFi < dataInici ||
						(*iteradorReserves).dataInici > dataInici);
		iteradorReserves++;
	}

	return !hiHaCollisio;
}

//-- Funcions i Struct per convertir reserves --//

typedef struct{
	int nHabitacio;
	char aNomDe[200];
	char dataInici[9];
	char dataFi[9];
} t_strg_reserva;

t_strg_reserva convertirReserves2STRG( t_reserva reserva ) {
        t_strg_reserva novaReserva;
        strncpy ( novaReserva.aNomDe,reserva.aNomDe.c_str(), 200);
        strncpy ( novaReserva.dataFi,reserva.dataFi.c_str(),  9);
        strncpy ( novaReserva.dataInici,reserva.dataInici.c_str(), 9);
        reserva.habitacioAsignada = novaReserva.nHabitacio;
        return novaReserva;
}

t_reserva convertirSTRG2Reserva( t_strg_reserva strg_reserva) {
        t_reserva reserva;
        reserva.aNomDe = strg_reserva.aNomDe;
        reserva.dataFi = strg_reserva.dataFi;
        reserva.dataInici = strg_reserva.dataInici;
        reserva.habitacioAsignada = strg_reserva.nHabitacio;
        return reserva;
}
